from random import randint
from functools import partial
import tkinter as tk

window = tk.Tk() # создать окно приложения
window.title("Угадай число") # название приложения / заголовок окна

# Получаем ширину и высоту экрана
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()

# Вычисляем координаты окна приложения
window_width = 500 # ширина окна
window_height = 300 # высота окна
# расчитываем координаты середины экрана,
# чтобы расположить поцентру всплывающее окно
x = (screen_width // 2) - (window_width // 2) 
y = (screen_height // 2) - (window_height // 2)
# задаем геометрию всплывающего окна
window.geometry(f"{window_width}x{window_height}+{x}+{y}")

def get_num(cnt):
    return randint(1, 2**cnt)

def check_num():
    """
    процедура проверяет, соответствует ли введеное число загаданному
    """
    global cnt, num
    input_num = entry1.get() # получение данных из формы виджет entry1
    print(num, input_num, cnt) # проверка 
    try:
        input_num = int(input_num)
        cnt -= 1 # уменьшаем количество попыток
        if input_num == num: # если угадали число
            entry1.delete(0, tk.END) # обновить поле для ввода
            button1.config(text = 'Играть еще раз') # заменить надпись на кнопке
            label2.config(text = f'Угадал. Загаданное число {num}') # вывести сообщение о выигрыше
            cnt = 7 # обновить счетчик попыток
            num = get_num(cnt) # получить новое число
        elif input_num > num:
            label2.config(text = f'Не угадал, загаданное число меньше. Количество попыток {cnt}')
            button1.config(text = 'Проверить') # заменить надпись на кнопке
        else:
            label2.config(text = f'Не угадал, загаданное число больше. Количество попыток {cnt}')
            button1.config(text = 'Проверить') # заменить надпись на кнопке
        if cnt <= 0:
            label2.config(text = f'Не угадал. Конец игре.')
            button1.destroy() # удаление виджета button1 (кнопка)

    except:
        label2.config(text = 'Ошибка при вводе числа')
            

# начальные параметры
cnt = 7 # количество попыток
num = get_num(cnt) # максимальное значение диапазона

# создание текстовой метки во всплываюдщем окне
label1 = tk.Label(window, text = f"Угадайте загаданное число от 1 до {2**cnt}", font = 'Cambria 14', )
label2 = tk.Label(window, text = "", font = 'Cambria 12')

# создание поля для ввода числа
entry1 = tk.Entry(window, font='Cambria 14', width=30)

# создание кнопки
button1 = tk.Button(window,                 # window - имя окна приложения
                    text = "Проверить",     # text - текст на кнопке
                    font = 'Cambria 14',    # font - шрифт виждета
                    command = partial(check_num))  # command - связать кнопку с функцией command = check_num()
                                            # command = partial(func_name, param1, param2...) функция c параметрами
 
# вывод созданных виджетов во всплывающем окне
label1.pack()
entry1.pack()
button1.pack()
label2.pack()

window.mainloop() # циклический запуск, чтобы окно не закрывалось
